<?php


class UsersController extends AppController 
{
	
	public $uses = array('TipoCuenta','User');	
	public $bandera = true;
	
	public function beforeFilter()   
	{
        parent::beforeFilter();
        $this->Auth->allow('create_usuario');
	}
	#---------------------------------------------------#
	#------------Funciones Principales------------------#
	#---------------------------------------------------#

	public function login() 
	{
	    $this->layout = 'default_ini';
		$user = $this->Session->read("Auth.User");
		if (!$user)
		{
			if ($this->request->is('post')) 
		    {
		        	
				
				
		        if ($this->Auth->login()) 
		        {
		            $usuario = $this->User->query(
		            								'SELECT * 
		            								FROM users U 
		            								WHERE U.username = "'.$this->request->data['User']['username'].'"'
													);
					
		            if ($usuario[0]['U']['tipo_cuenta_id'] == '1')
					{
						$this->redirect($this->Auth->redirect());
					}
					else 
					{
						$this->setMessageFlash(2, 'Solo Administradores pueden utilizar este portal', null);
						$this->redirect(
											array(
													'controller' => 'Users',
													'action' => 'logout'
												  )
										);
					}
		            
		        }
				else 
				{
					$this->setMessageFlash(2, 'Usuario o Contraseña Invalida, Intente Nuevamente', null);
				}
		        
		    }
		}
		else 
		{
			$this->redirect(array('controller' => 'Home', 'action' => 'index'));	
		}	
	    
	}
	
	public function logout() 
	{
		$this->layout = 'default_ini';	
    	return $this->redirect($this->Auth->logout());

	}
	
    public function index() 
    {
        $this->layout = 'default_ini';	
        $this->User->recursive = 0;
        $this->set('users', $this->paginate());
    }
	
	public function add_usuario() 
    {
		$this->layout = 'default_ini';	
		$this->llenar_combobox_tipo_cuenta();
		if ($this->request->is('post')) 
        {
			
			$this->añadir_cuenta();
		}

    }
    
    public function consult_usuario() 
    {
        $this->layout = 'default_ini';	
		
		$this->set('fecha_inic', strtotime(date('Y-01-01')));
		$this->set('fecha_fin', strtotime(date('Y-12-31')));
		
		$this->infoConsultUsuario();
		
        
    }
	public function consult_usuario1() 
    {
        $this->layout = 'default_ini';	
		
		$this->set('fecha_inic', strtotime(date('Y-01-01')));
		$this->set('fecha_fin', strtotime(date('Y-12-31')));
		
		$this->infoConsultUsuario(1,$id_tipo_cuenta,$fecha_inic,$fecha_fin,$nombre_cuenta,$cedula_cuenta);
		if($this->request->is('post') ||$this->request->is('put'))
		{
			$this->postConsultUsuario();
		}
        
    }

	
	public function detalle_usuario($id_usuario = null) 
    {
        $this->layout = 'default_ini';	
		
		if($id_usuario == "")
		{
			$this->setMessageFlash(1, 'se actualizo nombre', null);('error $id_tipo_cuenta');
		}
		else 
		{
			$this->infoUsuario($id_usuario);
			
		}
		
        
    }
	
	public function edit($id = null) 
    {
        $this->layout = 'default_ini';	
        $this->User->id = $id;
        if (!$this->User->exists()) 
        {
            throw new NotFoundException(__('Invalid user'));
        }
        if ($this->request->is('post') || $this->request->is('put')) 
        {
            if ($this->User->save($this->request->data)) 
            {
                $this->setMessageFlash(1, 'Se guardo los cambios Satisfactoriamente', null);
                return $this->redirect(array('action' => 'index'));
            }
            $this->setMessageFlash(2, 'No se pudo guardar los cambios, intente nuevamente', null);
        } 
        else 
        {
            $this->request->data = $this->User->read(null, $id);
            unset($this->request->data['User']['password']);
        }
    }

    public function delete($id = null) 
    {
        if (!$this->request->is('post')) 
        {
            throw new MethodNotAllowedException();
        }
        $this->User->id = $id;
        if (!$this->User->exists()) 
        {
            throw new NotFoundException(__('Invalid user'));
        }
        if ($this->User->delete()) 
        {
            $this->setMessageFlash(1, 'User deleted', null);
            return $this->redirect(array('action' => 'index'));
        }
        $this->setMessageFlash(2, 'User was not deleted', null);
        return $this->redirect(array('action' => 'index'));
    }
	
	private function length_arreglo_usuario($arreglo_usuario)
	{
		$usuarios = explode(',', $arreglo_usuario);
		return count($usuarios);
	}
	
	public function proceso_activacion_desactivacion_usuario($id_usuario,$id_active,$id_val = null)
	{
		
		if(!$id_usuario)
		{
			$this->setMessageFlash(2, 'error id_usuario', null);
		}
		elseif (!$id_active)
		{
			$this->setMessageFlash(2, 'error id null', null);
		}
		elseif (!$id_val)
		{
			$this->setMessageFlash(2, 'error id_val null', null);
		}
		else 
		{
			if ($id_val == 1) // Si solo se va activar/descativar un articulo
			{
				$this->proceso_de_act_deact_single($id_usuario,$id_active);
			}
			elseif ($id_val == 2)  // Si se va activar/descativar un grupo de articulos articulos
			{
				if ($this->length_arreglo_usuario($id_usuario) > 2)
				{
					$this->proceso_de_act_deact_multiples($id_usuario,$id_active);
				}
				elseif ($this->length_arreglo_usuario($id_usuario) == 2) 
				{
					$usuario = explode(',', $id_usuario);
					
					$this->proceso_de_act_deact_single($usuario[1],$id_active);	
				}
			}
			else 
			{
					$this->setMessageFlash(3, "error", null);
			}
			//$this->redirect($this->referer());
			
		}
	}

	public function edit_usuario($id_usuario)
	{
			
		$this->layout = 'default_ini';	
		$usuarios = $this->User->findById($id_usuario);
		
		$this->set('usuarios',$usuarios);	
		
		if ($this->request->is('post') || $this->request->is('put') )
		{
			debug($this->request->data);
			//$info_usuario = $this->request->data;	
			//$this->modificar_informacion_usuario($info_usuario['User']['id_accion'],$info_usuario);
		}
	}
	
	#---------------------------------------------------#
	#---------------Funciones Secundarias---------------#
	#---------------------------------------------------#
	private function setMessageFlash($id,$mensaje,$nombre_mensaje)
	{
		if (is_null($nombre_mensaje))
		{
			$nombre_mensaje = 'flash';
		}
		switch ($id) 
		{
			case 1: // mensaje bueno
				$this->Session->setFlash($mensaje,'default',array('class'=>'success'),$nombre_mensaje);
				break;
			case 2: // mensaje malo
				$this->Session->setFlash($mensaje,'default',array('class'=>'error-message'),$nombre_mensaje);
				break;
			case 3: // mensaje cuidado
				$this->Session->setFlash($mensaje,'default',array('class'=>'notice'),$nombre_mensaje);
				
				break;
			
			default:
				
				break;
		}
	}

	public function getEditUsuario($id_usuario)
	{
		$this->layout = false;
		
		if ($this->request->is('get')) 
		{
			$this->infoUsuario($id_usuario);
			
			$this->render('/Elements/GetEditUser');
		}
		elseif ($this->request->is('post') || $this->request->is('put') )
		{
			
			$info_usuario = array( 
										'User'=> $this->request->data
									);	
			$this->modificar_informacion_usuario($info_usuario['User']['id_accion'],$info_usuario);
		}
		
	}
	
	public function getDetalleUsuario($id_usuario)
	{
		$this->layout = false;
		if ($this->request->is('get')) 
		{
			
			$this->infoUsuario($id_usuario);
			$this->render('/Elements/GetDetalleUser');
		}
	}
	
	public function llenar_combobox_tipo_busq()
	{
			
		$arreglo = array();
	
		array_push($arreglo, array(0 => 'Todos'));
		array_push($arreglo, array(1 => 'Cuentas de Usuario por Asignar'));
		array_push($arreglo, array(2 => 'Cuenta de Usuarios Asignados'));
	
		$this->set('tipo_busq',$arreglo);
	}
	
	public function getGridConsultUsuario($id_tipo_busqueda,$id_tipo_cuenta,$fecha_inic,$fecha_fin,$nombre_cuenta,$cedula_cuenta)
	{
		
		$this->layout = false;
		if ($this->request->is('get')) 
		{
			
			$this->llenar_usuario($id_tipo_busqueda,$id_tipo_cuenta,$fecha_inic,$fecha_fin,$nombre_cuenta,$cedula_cuenta);
			$this->render('/Elements/GridConsultUsuario');
		}
		
	}
	
		###-----------------------------------------------###
		###------------Funciones de Consult_Usuario-------###
		###-----------------------------------------------###
		public function llenar_comobobox_tipo_cuenta($id)
		{
			$tipo_cuentas = $this->TipoCuenta->find('all');
			
			$arreglo = array();
		
			if ($id == 1)
			{
				array_push($arreglo, array(0 => 'Todos'));
			}
			foreach ($tipo_cuentas as $tipo_cuenta) 
			{
					array_push($arreglo, array($tipo_cuenta['TipoCuenta']['id'] => $tipo_cuenta['TipoCuenta']['nombre_tipo_cuenta']));
			}
		
			$this->set('tipo_cuentas',$arreglo);
			
		}
		
		public function postConsultUsuario()
		{
			$nombre_a_buscar = $this->request->data['Consult_Usuario']['nombre_usuario_busq'];
			$cedula_a_buscar = $this->request->data['Consult_Usuario']['cedula_usuario_busq'];
			if ($nombre_a_buscar == NULL)
			{
				$nombre_a_buscar = '*';
			}
			if ($cedula_a_buscar == NULL)
			{
				$cedula_a_buscar = '*';
			}
			$tipo_de_usuario = $this->request->data['Consult_Usuario']['tipo_de_usuario'];
			
			$fecha_inic = $this->request->data['Consult_Usuario']['calendario_desde_fecha'];
			$fecha_fin = $this->request->data['Consult_Usuario']['calendario_hasta_fecha'];
			
			$tiempo_desde = strtotime($fecha_inic);
			$tiempo_hasta = strtotime($fecha_fin);
			
			$this->redirect(array('action' => 'consult_usuario', $tipo_de_usuario,$tiempo_desde,$tiempo_hasta,$nombre_a_buscar,$cedula_a_buscar));
		}
		
		public function infoConsultUsuario(/*$id_tipo_busq,$id_tipo_cuenta,$fecha_inic,$fecha_fin,$nombre_cuenta,$cedula_cuenta*/)
		{
			$this->llenar_comobobox_tipo_cuenta(1);
			$this->llenar_combobox_tipo_busq();
			//$this->llenar_usuario($id_tipo_busq,$id_tipo_cuenta,$fecha_inic,$fecha_fin,$nombre_cuenta,$cedula_cuenta);
		}
		public function getFechaFormAdd($fecha)
		{
			$separacion_fecha = explode('/', $fecha);
			$string_fecha = ''.$separacion_fecha[2].'-'.$separacion_fecha[1].'-'.$separacion_fecha[0];

			return date($string_fecha);
		}
		public function llenar_usuario($id_tipo_busqueda,$id_tipo_cuenta,$fecha_inic,$fecha_fin,$nombre_cuenta,$cedula_cuenta)
		{
			//$date_desde = date('Y/m/d',$fecha_inic);
			//$date_hasta = date('Y/m/d',$fecha_fin);
			
			$date_desde = date('Y/m/d',$fecha_inic);
			$date_hasta = date('Y/m/d',$fecha_fin);
				
			
			$str_query = "";
								

			if ($id_tipo_busqueda == 0) //Todos los usuarios
			{
				$str_query = 'SELECT 
								U.*,TC.*,
								COALESCE(P.ci_persona,"No Posee") AS cedula_persona,
								COALESCE(CONCAT( P.nombre_persona_1,  " ", P.apellido_persona_1) ,  "No Posee" ) AS nombre_completo
								FROM tipo_cuentas TC, users U
								LEFT OUTER JOIN personas P ON U.persona_id = P.id
								WHERE U.tipo_cuenta_id = TC.id';	
			}
			elseif ($id_tipo_busqueda == 1) //Usuarios por Asignar
			{
				$str_query = 'SELECT 
								U.*,TC.*, 
								COALESCE(P.ci_persona,"No Posee") AS cedula_persona,
								COALESCE(CONCAT( P.nombre_persona_1,  " ", P.apellido_persona),  "No Posee" ) AS nombre_completo
								FROM tipo_cuentas TC, users U
								LEFT OUTER JOIN personas P ON U.persona_id = P.id
								WHERE U.persona_id IS NULL
								AND U.tipo_cuenta_id = TC.id';	
			}
			elseif ($id_tipo_busqueda == 2) //Usuarios asignados
			{
				$str_query = 'SELECT 
								U.*, TC.*
								CONCAT( P.nombre_persona_1,  " ", P.apellido_persona_1 ) AS nombre_completo,
								FROM users U, personas P, tipo_cuentas TC
								WHERE U.persona_id = P.id
								AND U.tipo_cuenta_id = TC.id';	
			}
			if ($id_tipo_cuenta != 0)
			{
				$str_query = $str_query.' AND TC.id = '.$id_tipo_cuenta;
			}
			if ($nombre_cuenta != '*')
			{
				$str_query = $str_query.' AND U.username LIKE "%'.$nombre_cuenta.'%"';
			}
			if ($cedula_cuenta != '*')
			{
				$str_query = $str_query.' AND P.ci_persona LIKE "%'.$cedula_cuenta.'%"';
			}
			
			$str_query = $str_query.' AND U.fecha_inscripcion_user BETWEEN "'.$date_desde.'" AND "'.$date_hasta.'"';
			
			$str_query = $str_query . ' ORDER BY U.id ASC ';
			$usuarios = $this->User->query($str_query);
			
			$this->set('id_tipo_cuenta',$id_tipo_cuenta);
			$this->set('fecha_inic',$fecha_inic);
			$this->set('fecha_fin',$fecha_fin);
			$this->set('nombre_cuenta',$nombre_cuenta);
			$this->set('cedula_cuenta',$cedula_cuenta);
			$this->set('id_tipo_busqueda',$id_tipo_busqueda);
	        $this->set('usuarios', $usuarios);
		}
		
		
		/*public function buscar_todos_usuarios()
		{
			$usuarios = $this->User->query('SELECT U.ID, U.USERNAME, U.FECHA_INSCRIPCION_USER, P.CI_PERSONA, U.ACTIVE_USER, 
											CONCAT( P.NOMBRE_PERSONA_1,  " ", P.APELLIDO_PERSONA_1 ) AS NOMBRE_COMPLETO
											FROM USERS U, PERSONAS P
											WHERE U.PERSONA_ID = P.ID'
        					
			);
			
	        $this->set('usuarios', $usuarios);
		}*/
		
		###-----------------------------------------------###
		###------------Funciones de detalle_Usuario-------###
		###-----------------------------------------------###
		
		public function infoUsuario($id_usuario)
		{
			$usuario = $this->User->query(
											'SELECT U.*, 
												P.*,
												TC.*
												FROM tipo_cuentas TC, users U
												LEFT OUTER JOIN personas P ON U.persona_id = P.id
												WHERE U.tipo_cuenta_id = TC.id 
												AND U.id = '.$id_usuario
											);
			
			$this->set('usuario',$usuario);
		}
		
		###-----------------------------------------------###
		###------------Funciones de Create_Usuario--------###
		###-----------------------------------------------###
		
		public function llenar_combobox_tipo_cuenta()
		{
			#Procedimiento para cargar los tipo de cuenta al combobox
			#primero se agarra todos los valores de la tabla
			#tipo_cuenta, ahora se tiene un array el cual adentro tiene
			#la informacion que queremos, para ello se crea un array
			#vacio, una vez hacemos un loop de tal manera poder recorrer
			#el arreglo de la tabla cargos, dentro del loop vamos agarrando
			#la info y la ponemos de una en el arreglo cuentas, adicionalmente
			#insertamos un valor adicional, que en este caso es seleccione una opcion
			#para que cuando se haga el submit en el add, automaticamente agarre
			#el id de la cuenta como 1 o superior
			
			$cargos = $this->TipoCuenta->find('all');
			$cuentas = array();
			array_push($cuentas, array( 0 => "Seleccione una Opcion"));
			foreach($cargos as $cargo)
			{
				array_push($cuentas,array($cargo['TipoCuenta']['id'] => $cargo['TipoCuenta']['nombre_tipo_cuenta']));
			}		
			$this->set('tipocuentas',$cuentas);	
			
		}
		
		public function añadir_cuenta()
		{
			#Procedimiento valida si la informacion esta bien,
			#y si son correctos lo guarda en la base de datos
			#si no entonces regresa un mensaje diciendo error
			$this->User->create();
			
			$this->request->data['User']['fecha_inscripcion_user'] = date('Y-m-d H:i:s');
			$this->request->data['User']['fecha_modificaicion_user'] = date('Y-m-d H:i:s');
			
			
			if ($this->User->save($this->request->data)) 
			{
				$this->setMessageFlash(1, 'Se guardo el usuario', null);
				$this->redirect(array('action' => 'index'));
			} 
			else 
			{
				$this->setMessageFlash(2, 'No se guardo el usuario', null);
			}
			
			
		}
		
		###-----------------------------------------------###
		###------------Funciones de Edit_Persona----------###
		###-----------------------------------------------###
    	
    	private function redirigir_pagina_edit ($pagina,$id_usuario = null)
		{
			if ($pagina == 1)
			{
				$this -> redirect(array(
										'controller' => 'users',
										'action' => 'consult_usuario'
								   )
							 );
			}
			elseif ($pagina == 2)
			{
				if($id_usuario)
					$this -> redirect(array(
											'controller' => 'users',
											'action' => 'edit_usuario',$id_usuario
									   )
								 );
				else
				{
					$this->setMessageFlash(2, 'error pagina', null);
					$this->redirigir_pagina_edit(1);
				}
			}
			else 
			{
				$this->setMessageFlash(2, 'error pagina', null);
			}
		}
		
		private function modificar_informacion_usuario($id_accion,$arreglo_post)
		{

			$id_accion = $arreglo_post['User']['id_accion'];
			switch ($id_accion) {
				
				case '1': // modidifica el nombre
					
					unset($arreglo_post['User']['id_accion']);
					
					$this->User->create();
					if ($this -> User -> save($arreglo_post))
					{
						$this->setMessageFlash(1, 'se actualizo nombre', null);
						//$this->setMessageFlash(1, 'se actualizo nombre', null);(__('se actualizo nombre'));
						//$this->redirigir_pagina_edit(2,$arreglo_post['User']['id']);
						
						//debug($this->User->id);
						
						
					}
					else 
					{
						
						$this->setMessageFlash(2, 'error, no se actualizo nombre', null);
					}
					$this -> redirect(array(
										'controller' => 'users',
										'action' => 'getEditUsuario',$this->User->id
								   )
							 );
					
					break;
					
				case '2': // modidifica el password
					
					$arreglo_post['User']['password']=123456789;
					
					unset($arreglo_post['User']['id_accion']);

					$this->User->create();
					if ($this -> User -> save($arreglo_post))
					{
						$this->setMessageFlash(1, 'se actualizo password', null);
					}
					else 
					{
						$this->setMessageFlash(2, 'error, no se actualizo password', null);
					}
					$this -> redirect(array(
										'controller' => 'users',
										'action' => 'getEditUsuario',$this->User->id
								   )
							 );
					break;
				
				default: //error decision
					
					$this->setMessageFlash(2, 'error, id_accion', null);
					
					break;
			}


				
				
				
		}
		
		private function proceso_de_act_deact_single ($id_usuario,$id_active)
		{
			$this->layout = false;	
			if (!$id_active)
			{
				$this->setMessageFlash(2, 'error id null',null);	
			}
			elseif (!$id_usuario)
			{
				$this->setMessageFlash(2, 'error id_usuario null',null);	
			}
			else 
			{
				
				$usuario = $this->User->findById($id_usuario);
				if ($usuario)
				{
					if ($this->proceso_de_act_deact($id_usuario,$id_active))
					{
						if ($id_active == 1) # proceso de activacion
						{
							$this->setMessageFlash(1, 'Se ha activado el usuario',null);
							
						}
						elseif ($id_active == 2)
						{
							$this->setMessageFlash(1, 'Se ha desactivado el usuario',null);		
						}
					}
					else 
					{
						$this->setMessageFlash(2, 'No se pudo completar el proceso de Activacion/Desactivacion del usuario',null);
						
					}
				}
				else 
				{
					$this->setMessageFlash(2, 'error usuario',null);
				}
			}	
		}
		
		private function proceso_de_act_deact_multiples($id_usuario,$id_active)
		{
			$this->layout = false;	
			if (!$id_active)
			{
				$this->setMessageFlash(2, 'error id null', null);
			}
			elseif (!$id_usuario)
			{
				$this->setMessageFlash(2, 'error $id_usuario null', null);
			}
			else 
			{
				$usuarios = explode(',', $id_usuario);
				
				$buenas = array();
				$malas = array();
				
				foreach ($usuarios as $usuario ) 
				{
					if($usuario != "")
					{
						$usuario_ext = $this->User->findById($usuario);
						if ($usuario_ext) 
						{
							if ($this->proceso_de_act_deact($usuario,$id_active))
							{
								array_push($buenas,$usuario);
							}
							else 
							{
								array_push($malas,$usuario);
							}
						}
					}
				}
				if ($buenas != null )
				{
					if ($malas != null)
					{
						
						$this->setMessageFlash(2, 'No se pudo terminar por completo el proceso', null);
						//return 3; // significa que varias se pudieron eliminar, otras no.
					}
					else 
					{
							
						if ($id_active == 1) # proceso de activacion
						{
							$this->setMessageFlash(1, 'Se Activaron los Usuarios seleccionados', null);
						}
						elseif ($id_active == 2)
						{
							$this->setMessageFlash(1, 'Se Desactivaron los Usuarios seleccionados', null);
						}
						else 
						{
							$this->setMessageFlash(2, 'error buenas', null);
						}
						
						//return 1; // significa que todas se pudieron eliminar.
					}
				}
				else 
				{
					if ($malas != null)
					{
						if ($id_active == 1) # proceso de activacion
						{
							$this->setMessageFlash(2, ' No Se Activaron los Usuarios seleccionados', null);
						}
						elseif ($id_active == 2)
						{
							$this->setMessageFlash(2,'No Se Desactivaron los Usuarios seleccionados', null);
						}
						else 
						{
							$this->setMessageFlash(2, 'error buenas', null);
						}
						
						//return 2; //significa que no se puedieron eliminar ninguna
					}
					else 
					{
						$this->setMessageFlash(2,'error al Activar/Desactivar', null);
						//return 0; // error
					}
				}
				
				
			}
			
		}
		
		private function proceso_de_act_deact($id_usuario,$id_active)
		{
			$usuario_mod = "";
			if ($id_active == 1)
			{
				$usuario_mod = array( 'User' => array(
													'id' => $id_usuario,
													'active_user' => TRUE
			 									 )
							    );
				debug($usuario_mod);
			}
			elseif ($id_active == 2)
			{
				$usuario_mod = array( 'User' => array(
													'id' => $id_usuario,
													'active_user' => FALSE
			 									 )
							    );
			}
			
			if ($this->User->save($usuario_mod))
			{
				return true;
			}
			else 
			{
				return false;
			}
		}

    
}
	

?>